// 地址自动加 1
#define  ADDR_INC_COMMAND  0x40
// 亮度 从 0x88 ~ 0x8f
#define DISP_COMMAND  0x88
// 设置起始地址
#define ADDR_COMMAND  0xC0

// TM1638模块引脚定义
int DIO = 23;
int CLK = 22;
int STB = 24;

void TM1638_init();

void setup() {
  pinMode(STB,OUTPUT);
  pinMode(CLK,OUTPUT);
  pinMode(DIO,OUTPUT);

  Serial.begin(9600);
  Serial.println("start");
  
  TM1638_init();
}

void loop() {
  
}

void TM1638_write(unsigned char DATA){
  pinMode(DIO,OUTPUT);
  for(int i=0;i<8;i++){
    digitalWrite(CLK,LOW);
    if(DATA & 0X01){
      digitalWrite(DIO,HIGH);
    } else {
      digitalWrite(DIO,LOW);
    }
    DATA>>=1;
    digitalWrite(CLK,HIGH);
  }
}

void TM1638_command(unsigned char cmd){
  digitalWrite(STB,LOW);
  TM1638_write(cmd);
  digitalWrite(STB,HIGH);
}

void TM1638_init(){
  TM1638_command(DISP_COMMAND);
  // 采用地址自动加1
  TM1638_command(ADDR_INC_COMMAND);       
  digitalWrite(STB,LOW);
  // 设置起始地址
  TM1638_write(ADDR_COMMAND);
  // 上电清零
  for(int i=0;i<16;i++){
    TM1638_write(0x00);
  }
  digitalWrite(STB,HIGH);
}
